home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / lang / ThreadLocal$ThreadLocalMap.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  3.4 KB  |  279 lines

  1. package java.lang;
  2.  
  3. class ThreadLocal$ThreadLocalMap {
  4.    private static final int INITIAL_CAPACITY = 16;
  5.    private ThreadLocal.ThreadLocalMap.Entry[] table;
  6.    private int size;
  7.    private int threshold;
  8.  
  9.    private void setThreshold(int var1) {
  10.       this.threshold = var1 * 2 / 3;
  11.    }
  12.  
  13.    private static int nextIndex(int var0, int var1) {
  14.       return var0 + 1 < var1 ? var0 + 1 : 0;
  15.    }
  16.  
  17.    private static int prevIndex(int var0, int var1) {
  18.       return var0 - 1 >= 0 ? var0 - 1 : var1 - 1;
  19.    }
  20.  
  21.    ThreadLocal$ThreadLocalMap(ThreadLocal var1, Object var2) {
  22.       this.size = 0;
  23.       this.table = new ThreadLocal.ThreadLocalMap.Entry[16];
  24.       int var3 = ThreadLocal.access$400(var1) & 15;
  25.       this.table[var3] = new ThreadLocal.ThreadLocalMap.Entry(var1, var2);
  26.       this.size = 1;
  27.       this.setThreshold(16);
  28.    }
  29.  
  30.    private ThreadLocal$ThreadLocalMap(ThreadLocal$ThreadLocalMap var1) {
  31.       this.size = 0;
  32.       ThreadLocal.ThreadLocalMap.Entry[] var2 = var1.table;
  33.       int var3 = var2.length;
  34.       this.setThreshold(var3);
  35.       this.table = new ThreadLocal.ThreadLocalMap.Entry[var3];
  36.  
  37.       for(int var4 = 0; var4 < var3; ++var4) {
  38.          ThreadLocal.ThreadLocalMap.Entry var5 = var2[var4];
  39.          if (var5 != null) {
  40.             ThreadLocal var6 = (ThreadLocal)var5.get();
  41.             if (var6 != null) {
  42.                Object var7 = var6.childValue(var5.value);
  43.                ThreadLocal.ThreadLocalMap.Entry var8 = new ThreadLocal.ThreadLocalMap.Entry(var6, var7);
  44.  
  45.                int var9;
  46.                for(var9 = ThreadLocal.access$400(var6) & var3 - 1; this.table[var9] != null; var9 = nextIndex(var9, var3)) {
  47.                }
  48.  
  49.                this.table[var9] = var8;
  50.                ++this.size;
  51.             }
  52.          }
  53.       }
  54.  
  55.    }
  56.  
  57.    private ThreadLocal.ThreadLocalMap.Entry getEntry(ThreadLocal var1) {
  58.       int var2 = ThreadLocal.access$400(var1) & this.table.length - 1;
  59.       ThreadLocal.ThreadLocalMap.Entry var3 = this.table[var2];
  60.       return var3 != null && var3.get() == var1 ? var3 : this.getEntryAfterMiss(var1, var2, var3);
  61.    }
  62.  
  63.    private ThreadLocal.ThreadLocalMap.Entry getEntryAfterMiss(ThreadLocal var1, int var2, ThreadLocal.ThreadLocalMap.Entry var3) {
  64.       ThreadLocal.ThreadLocalMap.Entry[] var4 = this.table;
  65.  
  66.       for(int var5 = var4.length; var3 != null; var3 = var4[var2]) {
  67.          ThreadLocal var6 = (ThreadLocal)var3.get();
  68.          if (var6 == var1) {
  69.             return var3;
  70.          }
  71.  
  72.          if (var6 == null) {
  73.             this.expungeStaleEntry(var2);
  74.          } else {
  75.             var2 = nextIndex(var2, var5);
  76.          }
  77.       }
  78.  
  79.       return null;
  80.    }
  81.  
  82.    private void set(ThreadLocal var1, Object var2) {
  83.       ThreadLocal.ThreadLocalMap.Entry[] var3 = this.table;
  84.       int var4 = var3.length;
  85.       int var5 = ThreadLocal.access$400(var1) & var4 - 1;
  86.  
  87.       for(ThreadLocal.ThreadLocalMap.Entry var6 = var3[var5]; var6 != null; var6 = var3[var5 = nextIndex(var5, var4)]) {
  88.          ThreadLocal var7 = (ThreadLocal)var6.get();
  89.          if (var7 == var1) {
  90.             var6.value = var2;
  91.             return;
  92.          }
  93.  
  94.          if (var7 == null) {
  95.             this.replaceStaleEntry(var1, var2, var5);
  96.             return;
  97.          }
  98.       }
  99.  
  100.       var3[var5] = new ThreadLocal.ThreadLocalMap.Entry(var1, var2);
  101.       int var8 = ++this.size;
  102.       if (!this.cleanSomeSlots(var5, var8) && var8 >= this.threshold) {
  103.          this.rehash();
  104.       }
  105.  
  106.    }
  107.  
  108.    private void remove(ThreadLocal var1) {
  109.       ThreadLocal.ThreadLocalMap.Entry[] var2 = this.table;
  110.       int var3 = var2.length;
  111.       int var4 = ThreadLocal.access$400(var1) & var3 - 1;
  112.  
  113.       for(ThreadLocal.ThreadLocalMap.Entry var5 = var2[var4]; var5 != null; var5 = var2[var4 = nextIndex(var4, var3)]) {
  114.          if (var5.get() == var1) {
  115.             var5.clear();
  116.             this.expungeStaleEntry(var4);
  117.             return;
  118.          }
  119.       }
  120.  
  121.    }
  122.  
  123.    private void replaceStaleEntry(ThreadLocal var1, Object var2, int var3) {
  124.       ThreadLocal.ThreadLocalMap.Entry[] var4 = this.table;
  125.       int var5 = var4.length;
  126.       int var7 = var3;
  127.  
  128.       ThreadLocal.ThreadLocalMap.Entry var6;
  129.       for(int var8 = prevIndex(var3, var5); (var6 = var4[var8]) != null; var8 = prevIndex(var8, var5)) {
  130.          if (var6.get() == null) {
  131.             var7 = var8;
  132.          }
  133.       }
  134.  
  135.       for(int var11 = nextIndex(var3, var5); (var6 = var4[var11]) != null; var11 = nextIndex(var11, var5)) {
  136.          ThreadLocal var9 = (ThreadLocal)var6.get();
  137.          if (var9 == var1) {
  138.             var6.value = var2;
  139.             var4[var11] = var4[var3];
  140.             var4[var3] = var6;
  141.             if (var7 == var3) {
  142.                var7 = var11;
  143.             }
  144.  
  145.             this.cleanSomeSlots(this.expungeStaleEntry(var7), var5);
  146.             return;
  147.          }
  148.  
  149.          if (var9 == null && var7 == var3) {
  150.             var7 = var11;
  151.          }
  152.       }
  153.  
  154.       var4[var3].value = null;
  155.       var4[var3] = new ThreadLocal.ThreadLocalMap.Entry(var1, var2);
  156.       if (var7 != var3) {
  157.          this.cleanSomeSlots(this.expungeStaleEntry(var7), var5);
  158.       }
  159.  
  160.    }
  161.  
  162.    private int expungeStaleEntry(int var1) {
  163.       ThreadLocal.ThreadLocalMap.Entry[] var2 = this.table;
  164.       int var3 = var2.length;
  165.       var2[var1].value = null;
  166.       var2[var1] = null;
  167.       --this.size;
  168.  
  169.       ThreadLocal.ThreadLocalMap.Entry var4;
  170.       int var5;
  171.       for(var5 = nextIndex(var1, var3); (var4 = var2[var5]) != null; var5 = nextIndex(var5, var3)) {
  172.          ThreadLocal var6 = (ThreadLocal)var4.get();
  173.          if (var6 == null) {
  174.             var4.value = null;
  175.             var2[var5] = null;
  176.             --this.size;
  177.          } else {
  178.             int var7 = ThreadLocal.access$400(var6) & var3 - 1;
  179.             if (var7 != var5) {
  180.                for(var2[var5] = null; var2[var7] != null; var7 = nextIndex(var7, var3)) {
  181.                }
  182.  
  183.                var2[var7] = var4;
  184.             }
  185.          }
  186.       }
  187.  
  188.       return var5;
  189.    }
  190.  
  191.    private boolean cleanSomeSlots(int var1, int var2) {
  192.       boolean var3 = false;
  193.       ThreadLocal.ThreadLocalMap.Entry[] var4 = this.table;
  194.       int var5 = var4.length;
  195.  
  196.       do {
  197.          var1 = nextIndex(var1, var5);
  198.          ThreadLocal.ThreadLocalMap.Entry var6 = var4[var1];
  199.          if (var6 != null && var6.get() == null) {
  200.             var2 = var5;
  201.             var3 = true;
  202.             var1 = this.expungeStaleEntry(var1);
  203.          }
  204.       } while((var2 >>>= 1) != 0);
  205.  
  206.       return var3;
  207.    }
  208.  
  209.    private void rehash() {
  210.       this.expungeStaleEntries();
  211.       if (this.size >= this.threshold - this.threshold / 4) {
  212.          this.resize();
  213.       }
  214.  
  215.    }
  216.  
  217.    private void resize() {
  218.       ThreadLocal.ThreadLocalMap.Entry[] var1 = this.table;
  219.       int var2 = var1.length;
  220.       int var3 = var2 * 2;
  221.       ThreadLocal.ThreadLocalMap.Entry[] var4 = new ThreadLocal.ThreadLocalMap.Entry[var3];
  222.       int var5 = 0;
  223.  
  224.       for(int var6 = 0; var6 < var2; ++var6) {
  225.          ThreadLocal.ThreadLocalMap.Entry var7 = var1[var6];
  226.          if (var7 != null) {
  227.             ThreadLocal var8 = (ThreadLocal)var7.get();
  228.             if (var8 == null) {
  229.                var7.value = null;
  230.             } else {
  231.                int var9;
  232.                for(var9 = ThreadLocal.access$400(var8) & var3 - 1; var4[var9] != null; var9 = nextIndex(var9, var3)) {
  233.                }
  234.  
  235.                var4[var9] = var7;
  236.                ++var5;
  237.             }
  238.          }
  239.       }
  240.  
  241.       this.setThreshold(var3);
  242.       this.size = var5;
  243.       this.table = var4;
  244.    }
  245.  
  246.    private void expungeStaleEntries() {
  247.       ThreadLocal.ThreadLocalMap.Entry[] var1 = this.table;
  248.       int var2 = var1.length;
  249.  
  250.       for(int var3 = 0; var3 < var2; ++var3) {
  251.          ThreadLocal.ThreadLocalMap.Entry var4 = var1[var3];
  252.          if (var4 != null && var4.get() == null) {
  253.             this.expungeStaleEntry(var3);
  254.          }
  255.       }
  256.  
  257.    }
  258.  
  259.    // $FF: synthetic method
  260.    static ThreadLocal.ThreadLocalMap.Entry access$000(ThreadLocal$ThreadLocalMap var0, ThreadLocal var1) {
  261.       return var0.getEntry(var1);
  262.    }
  263.  
  264.    // $FF: synthetic method
  265.    static void access$100(ThreadLocal$ThreadLocalMap var0, ThreadLocal var1, Object var2) {
  266.       var0.set(var1, var2);
  267.    }
  268.  
  269.    // $FF: synthetic method
  270.    static void access$200(ThreadLocal$ThreadLocalMap var0, ThreadLocal var1) {
  271.       var0.remove(var1);
  272.    }
  273.  
  274.    // $FF: synthetic method
  275.    ThreadLocal$ThreadLocalMap(ThreadLocal$ThreadLocalMap var1, ThreadLocal.1 var2) {
  276.       this(var1);
  277.    }
  278. }
  279.